{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for RentListingInquries"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 用GridSearchCV调整min_child_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#导入准备调用的模块\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取train的数据文件并显示头5行数据\n",
    "train = pd.read_csv(\"./data/RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#分离特征列与目标列\n",
    "y_train = train['interest_level']\n",
    "\n",
    "X_train = train.drop(['interest_level'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#从前序代码的countplot图可知，三类目标的样本数量不均匀，故采用分层采样，考虑时间代价，将划分等级设为3，可能会影响最终的模型参数\n",
    "kfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'min_child_weight': range(4, 8)}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#设定min_child_weight调整的范围\n",
    "min_child_weight = range(4,8)\n",
    "param_t3=dict(min_child_weight=min_child_weight)\n",
    "param_t3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#实例化min_child_weight调优的XGBClassifier\n",
    "xgb3_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=220,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5, #第二轮参数调优时得到的max_depth最佳值\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=5, min_child_weight=1, missing=None, n_estimators=220,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=3, silent=True,\n",
       "       subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'min_child_weight': range(4, 8)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#实例化min_child_weight调优的GridSearchCV,并将以上的调优取值集合与学习器代入\n",
    "gsearch3_1 = GridSearchCV(xgb3_1, param_grid = param_t3, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_1.fit(X_train , y_train) #利用实例好的GridSearchCV来训练数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(                parameters  mean_validation_score  \\\n",
       " 0  {'min_child_weight': 4}              -0.593142   \n",
       " 1  {'min_child_weight': 5}              -0.592592   \n",
       " 2  {'min_child_weight': 6}              -0.592731   \n",
       " 3  {'min_child_weight': 7}              -0.592561   \n",
       " \n",
       "                                 cv_validation_scores  \n",
       " 0  [-0.588735124415, -0.593888347063, -0.59680129...  \n",
       " 1  [-0.587089798191, -0.595111664629, -0.59557517...  \n",
       " 2  [-0.588160073579, -0.594257702871, -0.59577619...  \n",
       " 3  [-0.587548341647, -0.595061548393, -0.59507375...  ,\n",
       " {'min_child_weight': 7},\n",
       " -0.59256116255224434)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#显示cv后的结果与最佳参数\n",
    "pd.DataFrame(gsearch3_1.grid_scores_), gsearch3_1.best_params_,     gsearch3_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上可知，计算出的min_child_weight最优值为7，但原设定的取值范围为range(4,8)，最优值在其上限，故需重新设定max_depth上限范围再做一轮参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'min_child_weight': range(6, 9)}"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#重新设定min_child_weight参数调节范围\n",
    "min_child_weight = range(6,9)\n",
    "param_t3_1=dict(min_child_weight=min_child_weight)\n",
    "param_t3_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=5, min_child_weight=1, missing=None, n_estimators=220,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=3, silent=True,\n",
       "       subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'min_child_weight': range(6, 9)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#实例化min_child_weight调优的GridSearchCV,并将以上的调优取值集合与学习器代入\n",
    "gsearch3_1 = GridSearchCV(xgb3_1, param_grid = param_t3_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_1.fit(X_train , y_train) #利用实例好的GridSearchCV来训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(                parameters  mean_validation_score  \\\n",
       " 0  {'min_child_weight': 6}              -0.592731   \n",
       " 1  {'min_child_weight': 7}              -0.592561   \n",
       " 2  {'min_child_weight': 8}              -0.592590   \n",
       " \n",
       "                                 cv_validation_scores  \n",
       " 0  [-0.588160073579, -0.594257702871, -0.59577619...  \n",
       " 1  [-0.587548341647, -0.595061548393, -0.59507375...  \n",
       " 2  [-0.588191612347, -0.594087399474, -0.59549149...  ,\n",
       " {'min_child_weight': 7},\n",
       " -0.59256116255224434)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#显示cv后的结果与最佳参数\n",
    "pd.DataFrame(gsearch3_1.grid_scores_), gsearch3_1.best_params_,     gsearch3_1.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从结果来看，将min_child_weight取值的上限范围重新设定后，其最优值仍为7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.592561 using {'min_child_weight': 7}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nW4pdtpk13rvvvst///d/N6rttddey4cfftjkGMrLy5k4cWKT+6kxfvx4HnjggTrlq1at4uSTTwZg\n5syZHH/88QXb9+/fn7feeqvZ4qlxzjnnsGhRw9+D64v9zTff5H//t6hfMTSLYpLFFSQ7/GURMUfS\n54A3iuk8Ih6NiC9ExD4RcVVa9pOImJq+/2FE7B8RB0bE0RHxWk7bJyJicEQMiojxEbFp+z+emW2v\nHSFZlJWVcf311ze5nyx9+vQpuCNuKb/85S8ZOHBgo9q2dLLIvBsqIu4H7s+ZXg6cVMqgzCxx+cML\nWbTq/Wbtc2CfXbn07/evd/6kSZNYtmwZQ4YMYfTo0ey555785je/YePGjYwbN47LL7+cDz74gFNO\nOYXKykq2bNnCj3/8Y9asWcOqVas4+uij6dmzJ0899VTB/rt27cp5553H9OnT6d69Oz/96U/513/9\nV1asWMG1117L2LFjmTlzJlOmTOGRRx7hsssuY8WKFSxfvpwVK1bw/e9/v8GjjjvvvJMpU6YgicGD\nB3PXXXcBMGvWLH7+85/z17/+lWuuuYaTTz6ZN998k+OPP54FCxZs08fatWs5/fTTqaqqYvjw4UTk\n35vzsWuuuYZOnToxceJELrzwQubNm8eMGTN48sknue2227j77ruZNm0al156KRs3bmSfffbhtttu\no2vXrowaNYopU6ZQVlbGr371K66++mr69OnDvvvuS8eOHbnhhhvqjX3SpEksXryYIUOG8O1vf5sL\nL7yw3hibQzEXuPtKekjS3yStkfSgpL4ljcrMWs3kyZPZZ599qKioYPTo0bzxxhvMnj2biooK5s6d\ny6xZs/jjH/9Inz59mDdvHgsWLGDMmDFMnDiRPn368NRTT9WbKAA++OADRo0axdy5c+nWrRuXXHIJ\nTzzxBA899BA/+clPCrZ57bXXePzxx5k9ezaXX345mzdvLlhv4cKFXHXVVcyYMYN58+Zx3XXX1c5b\nvXo1zz77LI888giTJtV5oMQ2Lr/8co488kheeeUVxo4dy4oVK+qtO3LkSJ555hkgOX22fv16Nm/e\nzLPPPsuIESN46623uPLKK5k+fTovv/wyZWVl/Pzn294jtGrVKv793/+dF198kSeeeILXXnttm/mF\nYp88eTIjRoygoqKi5IkCivudxW0kj/f4Rjp9Zlo2ulRBmVmioSOAljBt2jSmTZvGQQcdBMD69et5\n4403GDFiBBdffDE/+MEPOP744xkxYkTRfXbo0IExY8YAMGjQIDp27Ej79u0ZNGgQb775ZsE2X//6\n1+nYsSMdO3Zkzz33ZM2aNfTtW/c764wZMzj55JPp2bMnAHvssUftvBNPPJE2bdowcOBA1qxZ02CM\ns2bN4re//W3tsrt3715v3WHDhjF37lzWrVtHx44dGTp0KOXl5TzzzDNcf/31vPjiiyxatIgjjjgC\ngE2bNnHYYYdt08fs2bM56qijauP9xje+weuvv96o2EulmGTRKyJuy5m+XdL3SxWQme04IoIf/vCH\n/PM//3OdeXPnzuXRRx/lhz/8IV/5ylfqPSrI1759+9rbONu0aUPHjh1r31dXVxdsU1MHoG3btvXW\ni4h6bxHN7aOh00o1ir3VtH379vTv35/bbruNww8/nMGDB/PUU0+xbNky9ttvP5YtW8bo0aO55557\n6u0jK57tjb0UirnA/ZakMyW1TV9nAmtLHZiZtY5u3bqxbt06AL761a9y6623sn598sSdv/zlL/zt\nb39j1apVdOnShTPPPJOLL76Yl19+uU7b1nDMMcfwm9/8hrVrk13U22+/3ah+Ro4cya9//WsAHnvs\nMd55553M+lOmTGHkyJGMGDGCm266iSFDhiCJQw89lOeee46lS5cC8OGHH25z1AAwfPhwnn76ad55\n5x2qq6t58MEHM2Ns6XVdTLI4m+S22b8Cq4GTSR4BYmY7oR49enDEEUdwwAEH8MQTT3DGGWdw2GGH\nMWjQIE4++WTWrVvH/PnzGT58OEOGDOGqq67ikksuAeDcc8/luOOO4+ijj26V2Pfff39+9KMfcdRR\nR3HggQdy0UUXNaqfSy+9lFmzZjF06FCmTZvGZz7zmQbrjxgxgtWrV3PYYYex11570alTp9pTc716\n9eL222/n9NNPZ/DgwRx66KF1rknsvffe/Nu//RuHHHIIxx57LAMHDmS33XZrcJmDBw+mXbt2HHjg\ngfziF79o1OfcHmrMIY2k70fEtSWIp9HKysqivLy8tcMwa7LFixez3377tXYY1sLWr19P165dqa6u\nZty4cZx99tmMGzeuWZdRaNuSNDciyrLaNnakvMalazMzK+iyyy5jyJAhHHDAAQwYMIATTzyxtUPa\nRjEXuAvxg2vMrEGHHHIIGzdu3KbsrrvuYtCgQU3ue+3atRxzzDF1yp988kl69OjR5P5bY5lTpkxp\nch+l1Nhk0TqX483sE+Oll14qWd89evSgoqKiZP3vKMvckdSbLCSto3BSENC5ZBGZmdkOp95kERHd\nWjIQMzPbcTX2AreZmX2KOFmYmVkmJwsz20ZjH1H+ta99jXfffbcEESUOP/zwZuvr9ttvZ8KECQXn\n5X6Orl27FqxT3xgTTXXTTTdx5513Nlinodh/+tOfNntMNZwszGwb9SWLLVu2NNju0UcfZffddy9V\nWDz//PMl6ztXqT9HQ7773e/yrW99q9HtS5ksMm+dreeuqPeAcuD/pONb1Nd2DHAd0Bb4ZURMzps/\nHvgP4C9p0Q0R8ct03hZgflq+IiLGYvZp89gk+Ov87Hrb4+8GwXGT652dO55F+/bt6dq1K71796ai\nooJFixZx4oknsnLlSj766CMuuOACzj33XCAZTa7mEd3HHXccRx55JM8//zx77703v//97+ncufBN\nlKNGjeKggw5i7ty5VFVVceedd/Kzn/2M+fPnc+qpp3LllVcCybf89evXM3PmTC677DJ69uzJggUL\nGDZsGHfffXe9D/6bM2cOF1xwAR988AEdO3bkySefBJLHgo8ZM4Zly5Yxbtw4rrnmmm0+R82TayF5\neN/555/PjBkzGDBgQIMP85s9ezaTJ0/mt7/9Lb///e857bTTeO+999i6dSsDBw5k+fLlLFu2jPPO\nO4+qqiq6dOnCLbfcwpe+9CUuu+wyunbtysUXX8ycOXP4zne+wy677MKRRx7JY489VjvuRqHYJ02a\nxIYNGxgyZAj7779/7bOtmksxv7P4ObCK5DHlIhlL+++AJcCtwKhCjSS1BW4keZR5JTBH0tSIyB9D\n8L6IKHRMtSEihhTzIcys+UyePJkFCxZQUVHBzJkz+frXv86CBQsYMGAAALfeeit77LEHGzZs4OCD\nD+akk06q86O0N954g3vuuYdbbrmFU045hQcffJAzzzyz3mV26NCBWbNmcd1113HCCScwd+5c9thj\nD/bZZx8uvPDCOv2/8sorLFy4kD59+nDEEUfw3HPPceSRR9bpd9OmTZx66qncd999HHzwwbz//vu1\nSauiooJXXnmFjh078sUvfpHzzz+ffv36FYzvoYceYsmSJcyfP581a9YwcOBAzj777IJ1hw4dyiuv\nvALAM888wwEHHMCcOXOorq7mkEMOAZJnaN10003su+++vPTSS3zve99jxowZ2/Rz1llncfPNN3P4\n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\n+FuNAu3CygAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbcdf4a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 将GridSerachCV得到的结果反映在图示中\n",
    "#打印最佳参数与最佳性能得分\n",
    "print(\"Best: %f using %s\" % (gsearch3_1.best_score_, gsearch3_1.best_params_))\n",
    "test_means = gsearch3_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch3_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch3_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch3_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch3_1.cv_results_).to_csv('test_min_child_weight.csv')\n",
    "\n",
    "\n",
    "pyplot.plot(min_child_weight, -test_means, label= 'test_min_child_weight')\n",
    "pyplot.plot(min_child_weight, -train_means, label= 'train_min_child_weight')\n",
    "\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'test_min_child_weight' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('min_child_weight_vs_Logloss.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "从图可知，随min_child_weight增大，以mlogloss为评价指标时，train数据集的性能一直在提高，而test数据集的性能在min_child_weighth=7左右时最佳。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
